<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // 原型：
        // prototype:对象构成时所参考的模板(原型对象)，模板(构造函数)创建的对象是无法直接访问的
        // __proto__:给模板(构造函数)创建的对象提供用于指向构建该对象模板(原型对象)的一个属性
        function User(name){
            this.name=name;
        }
        User.prototype.say=function(){
            console.log("hi");
        };
        var u=new User("alice");
        console.log(u);
        console.log(u.__proto__===User.prototype);
        console.log(User.prototype);
        console.log(User.prototype.__proto__===Object.prototype);
        console.log(Object.prototype.__proto__);
        // 原型链：
        //     js中对象的最高原型指向于Object.prototype
        //     js中的一个数据的原型的连续关系称为原型链 
        // u  ---->  User.prototype ----> Object.prototype---->null

        // Object.create(prototype, descriptors)
        // 创建一个新的对象，使用其它对象的原型创建该对象
        // prototype提供构建该对象时的原型参考
                // 取值是一个存在的实例对象，新构建的对象会以该实例对象作为原型模板,同时会获取该实例对象的所有属性
                //取值为一个固定的原型，新构建的对象会以该原型作为模板
                // 取值为null，创建的是一个没有原型的特殊对象
        //   descriptors:对创建对象进行的属性设置描述
                // 取值方式类似于defineProperty的descriptors
        // var u2=Object.create(u);
        // console.log(u2.__proto__);
        // console.log(u2.name);
        // console.log(User.prototype);
        // var u3=Object.create(User.prototype);
        // console.log(u3);
        // var u4=Object.create(null,{
        //     name:{
        //         value:"tom",
        //         writable:true,
        //         enumerable:true,
        //         configurable:true
        //     }
        // });
        // console.log(u4);

        function Student(name){
            this.name=name;
        }   
        Student.prototype.say=function(){
            console.log("嘿嘿");
        };
        var u4=Object.create(Student.prototype);
        u4.say();
        console.log(Student.prototype);
        console.log(u4);

    </script>
</head>
<body>
    
</body>
</html>